﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

using MySql.Data.MySqlClient;

namespace MakeIT.MiraPark.Negocios
{
    public static partial class ModelBO
    {

        public static MovimentacaoVO getMovimentacao(int ticket)
        {
            List<MovimentacaoVO> listaMovimentacaoVo = getMovimentacoes(null, null, null, null, null, null, ticket, true, false, null, false, false, false, false, true);
            if (listaMovimentacaoVo != null && listaMovimentacaoVo.Count > 0)
                return listaMovimentacaoVo[0];
            else
                return null;
        }

        public static MovimentacaoVO getMovimentacao(int idMovimentacao, bool comMovimento)
        {
            List<MovimentacaoVO> listaMovimentacaoVo = getMovimentacoes(idMovimentacao, null, null, null, null, null, null, false, false, null, comMovimento, false, false, false, true);
            if (listaMovimentacaoVo != null && listaMovimentacaoVo.Count > 0)
                return listaMovimentacaoVo[0];
            else
                return null;
        }

        public static MovimentacaoVO getMovimentacao(string placa, bool semSaida, bool comSaida, bool comMovimento)
        {
            List<MovimentacaoVO> listaMovimentacaoVo = getMovimentacoes(null, null, null, null, null, placa, null, semSaida, comSaida, null, comMovimento, false, false, false, true);
            if (listaMovimentacaoVo != null && listaMovimentacaoVo.Count > 0)
                return listaMovimentacaoVo[0];
            else
                return null;
        }

        public static List<MovimentacaoVO> getMovimentacoes(bool comMovimento)
        {
            return getMovimentacoes(null, null, null, null, null, null, null, false, false, null, comMovimento, false, false, false, true);
        }

        public static List<MovimentacaoVO> getMovimentacoes(DateTime? data, string placa, bool semSaida, bool comSaida, string especie, bool comMovimento)
        {
            return getMovimentacoes(null, null, null, data, null, placa, null, semSaida, comSaida, especie, comMovimento, false, false, false, true);
        }

        public static List<MovimentacaoVO> getMovimentacoes(
             int? idMovimentacao, int? idCabine, int? idConvenio, DateTime? dataIni, DateTime? dataFim, 
             string placa, int? ticket, bool semSaida, bool comSaida, string especie, bool comMovimento, 
             bool semFechamentoDiario, bool semFechamentoCabine, bool semFechamentoConvenio, bool orderBY)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT IdMovimentacao, Ticket, IdCabineE, IdCabineS, IdConvenio, IdMensalista, Placa, Entrada, Saida, Valor, Obs, Especie, FechDiario, FechCabine, FechConvenio ");
            query.AppendLine("FROM movimentacao ");

            if (idMovimentacao != null)
            {
                query.AppendLine(where + "IdMovimentacao=?IdMovimentacao ");
                where = "AND ";
            }
            if (idCabine != null)
            {
                query.AppendLine(where + "IdCabineS=?IdCabine ");
                where = "AND ";
            }
            if (idConvenio != null)
            {
                query.AppendLine(where + "IdConvenio=?IdConvenio ");
                where = "AND ";
            }
            if (dataIni != null && dataFim != null)
            {
                query.AppendLine(where + "DATE(Entrada) BETWEEN DATE(?EntradaINI) AND DATE(?EntradaFIM) ");
                where = "AND ";
            }
            else if (dataIni != null)
            {
                query.AppendLine(where + "DATE(Entrada)=DATE(?EntradaINI) ");
                where = "AND ";
            }
            else if (dataFim != null)
            {
                query.AppendLine(where + "DATE(Entrada)=DATE(?EntradaFIM) ");
                where = "AND ";
            }
            if (placa != null)
            {
                query.AppendLine(where + "Placa=?Placa ");
                where = "AND ";
            }
            if (ticket != null)
            {
                query.AppendLine(where + "Ticket=?Ticket ");
                where = "AND ";
            }
            if (semSaida)
            {
                query.AppendLine(where + "Saida = '0001-01-01 00:00:00' ");
                where = "AND ";
            }
            if (comSaida)
            {
                query.AppendLine(where + "Saida <> '0001-01-01 00:00:00' ");
                where = "AND ";
            }
            if (especie!=null){
                query.AppendLine(where + "Especie=?Especie ");
                where = "AND ";
            }
            if (semFechamentoDiario)
            {
                query.AppendLine(where + "NOT FechDiario ");
                where = "AND ";
            }
            if (semFechamentoCabine)
            {
                query.AppendLine(where + "NOT FechCabine ");
                where = "AND ";
            }
            if (semFechamentoConvenio)
            {
                query.AppendLine(where + "NOT FechConvenio ");
                where = "AND ";
            }

            if (orderBY)
                query.AppendLine("ORDER BY Entrada DESC, Placa ");
            else
                query.AppendLine("ORDER BY IdMovimentacao ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (idMovimentacao != null) cmd.Parameters.AddWithValue("?IdMovimentacao", idMovimentacao);
            if (idConvenio != null) cmd.Parameters.AddWithValue("?IdConvenio", idConvenio);
            if (idCabine != null) cmd.Parameters.AddWithValue("?IdCabine", idCabine);
            if (dataIni != null) cmd.Parameters.AddWithValue("?EntradaINI", dataIni.Value);
            if (dataFim != null) cmd.Parameters.AddWithValue("?EntradaFIM", dataFim.Value);
            if (placa != null) cmd.Parameters.AddWithValue("?Placa", placa);
            if (ticket != null) cmd.Parameters.AddWithValue("?Ticket", ticket);
            if (especie != null) cmd.Parameters.AddWithValue("?Especie", especie);
            if (semFechamentoDiario) cmd.Parameters.AddWithValue("?FechDiario", especie);
            if (semFechamentoCabine) cmd.Parameters.AddWithValue("?FechCabine", especie);
            if (semFechamentoConvenio) cmd.Parameters.AddWithValue("?FechConvenio", especie);

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                List<MovimentacaoVO> listMovimentacaoVOs = new List<MovimentacaoVO>();

                while (reader.Read())
                {
                    MovimentacaoVO movimentacaoVO = MovimentacaoVO.CreateMovimentacaoVO();
                    movimentacaoVO.idMovimentacao = reader.GetInt32("IdMovimentacao");
                    movimentacaoVO.ticket = reader.GetInt32("Ticket");
                    movimentacaoVO.idCabineE = reader.GetInt32("IdCabineE");
                    movimentacaoVO.idCabineS = reader.GetInt32("IdCabineS");
                    movimentacaoVO.idConvenio = reader.GetInt32("IdConvenio");
                    movimentacaoVO.idMensalista = reader.GetInt32("IdMensalista");
                    movimentacaoVO.placa = reader.GetString("Placa");
                    movimentacaoVO.entrada = reader.GetDateTime("Entrada");
                    if (!reader.IsDBNull(reader.GetOrdinal("Saida")))
                        movimentacaoVO.saida = reader.GetDateTime("Saida");
                    movimentacaoVO.valor = reader.GetDecimal("Valor");
                    movimentacaoVO.obs = reader.GetString("Obs");
                    movimentacaoVO.especie = reader.GetString("Especie");
                    movimentacaoVO.fechDiario = reader.GetBoolean("FechDiario");
                    movimentacaoVO.fechCabine = reader.GetBoolean("FechCabine");
                    movimentacaoVO.fechConvenio = reader.GetBoolean("FechConvenio");

                    listMovimentacaoVOs.Add(movimentacaoVO);
                }
                reader.Close();

                if (comMovimento)
                    foreach (MovimentacaoVO movimentacaoVO in listMovimentacaoVOs)
                        movimentacaoVO.movimentoVOs = ModelBO.getMovimentos(null, movimentacaoVO.idMovimentacao);

                return listMovimentacaoVOs;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }
 
        }

        public static void setMovimentacao(MovimentacaoVO movimentacaoVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("UPDATE movimentacao ");
            query.AppendLine("SET Ticket=?Ticket, IdConvenio=?IdConvenio, IdCabineE=?IdCabineE, IdCabineS=?IdCabineS, IdMensalista=?IdMensalista, Placa=?Placa, Entrada=?Entrada, Saida=?Saida, Valor=?Valor, Obs=?Obs, Especie=?Especie, FechDiario=?FechDiario, FechCabine=?FechCabine, FechConvenio=?FechConvenio ");
            query.AppendLine("WHERE IdMovimentacao=?IdMovimentacao ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdMovimentacao", movimentacaoVO.idMovimentacao);
            cmd.Parameters.AddWithValue("?Ticket", movimentacaoVO.ticket);
            cmd.Parameters.AddWithValue("?IdCabineE", movimentacaoVO.idCabineE);
            cmd.Parameters.AddWithValue("?IdCabineS", movimentacaoVO.idCabineS);
            cmd.Parameters.AddWithValue("?IdConvenio", movimentacaoVO.idConvenio);
            cmd.Parameters.AddWithValue("?IdMensalista", movimentacaoVO.idMensalista);
            cmd.Parameters.AddWithValue("?Placa", movimentacaoVO.placa);
            cmd.Parameters.AddWithValue("?Entrada", movimentacaoVO.entrada);
            cmd.Parameters.AddWithValue("?Saida", movimentacaoVO.saida);
            cmd.Parameters.AddWithValue("?Valor", movimentacaoVO.valor);
            cmd.Parameters.AddWithValue("?Obs", movimentacaoVO.obs);
            cmd.Parameters.AddWithValue("?Especie", movimentacaoVO.especie);
            cmd.Parameters.AddWithValue("?FechDiario", movimentacaoVO.fechDiario);
            cmd.Parameters.AddWithValue("?FechCabine", movimentacaoVO.fechCabine);
            cmd.Parameters.AddWithValue("?FechConvenio", movimentacaoVO.fechConvenio);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static long newMovimentacao(MovimentacaoVO movimentacaoVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("INSERT INTO movimentacao ");
            query.AppendLine("SET Ticket=?Ticket, IdConvenio=?IdConvenio, IdCabineE=?IdCabineE, IdCabineS=?IdCabineS, IdMensalista=?IdMensalista, Placa=?Placa, Entrada=?Entrada, Saida=?Saida, Valor=?Valor, Obs=?Obs, Especie=?Especie, FechDiario=?FechDiario, FechCabine=?FechCabine, FechConvenio=?FechConvenio ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdConvenio", movimentacaoVO.idConvenio);
            cmd.Parameters.AddWithValue("?Ticket", movimentacaoVO.ticket);
            cmd.Parameters.AddWithValue("?IdCabineE", movimentacaoVO.idCabineE);
            cmd.Parameters.AddWithValue("?IdCabineS", movimentacaoVO.idCabineS);
            cmd.Parameters.AddWithValue("?IdMensalista", movimentacaoVO.idMensalista);
            cmd.Parameters.AddWithValue("?Placa", movimentacaoVO.placa);
            cmd.Parameters.AddWithValue("?Entrada", movimentacaoVO.entrada);
            cmd.Parameters.AddWithValue("?Saida", movimentacaoVO.saida);
            cmd.Parameters.AddWithValue("?Valor", movimentacaoVO.valor);
            cmd.Parameters.AddWithValue("?Obs", movimentacaoVO.obs);
            cmd.Parameters.AddWithValue("?Especie", movimentacaoVO.especie);
            cmd.Parameters.AddWithValue("?FechDiario", movimentacaoVO.fechDiario);
            cmd.Parameters.AddWithValue("?FechCabine", movimentacaoVO.fechCabine);
            cmd.Parameters.AddWithValue("?FechConvenio", movimentacaoVO.fechConvenio);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
                return cmd.LastInsertedId;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static void delMovimentacao(MovimentacaoVO movimentacaoVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("DELETE FROM movimentacao ");
            query.AppendLine("WHERE IdMovimentacao=?IdMovimentacao ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdMovimentacao", movimentacaoVO.idMovimentacao);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }
    }
}
